﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.IO;
using System.Xml.Linq;
using System.Windows.Forms;

namespace GestionBudget.Objects
{
    public class Transaction : ObjectPersistent
    {
        private const string NOM_FICHIER_XML = "transactions.xml";
        private const string RACINE_XML = "Transactions";

        private int identifiant;
        private Profil profil;
        private SousCategorie sousCategorie;
        private string description;
        private DateTime date;
        private decimal montant;

        public static Transaction Creer()
        {
            Transaction nouvelleTransaction = new Transaction();
            DictionnaireDonnees.ListeTransactions.Add(nouvelleTransaction);
            return nouvelleTransaction;
        }

        private Transaction()
        {
            if (Securite.ProfilCourant.ListeSousCategorie.Count > 0)
                this.sousCategorie = Securite.ProfilCourant.ListeSousCategorie.First();
            this.description = "Description de la transaction";
            this.date = DateTime.Now;
            SetEstNouveauTrue();
        }

        private Transaction(string identifiant, string identifiantProfil, string identifiantSousCategorie, string description, string date, string montant)
        {
            this.identifiant = Convert.ToInt32(identifiant);
            if (Convert.ToInt32(identifiantProfil) > 0)
            {
                this.profil = DictionnaireDonnees.ListeProfils.First(pr => pr.Identifiant.ToString().Equals(identifiantProfil));
            }
            if (Convert.ToInt32(identifiantSousCategorie) > 0)
            {
                this.sousCategorie = DictionnaireDonnees.ListeSousCategories.First(sc => sc.Identifiant.ToString().Equals(identifiantSousCategorie));
            }
            this.description = description;
            this.date = DateTime.Parse(date);
            this.montant = Convert.ToDecimal(montant.Replace(".", ","));
        }

        public int Identifiant
        {
            get { return identifiant; }
        }

        public Profil Profil
        {
            get
            {
                return profil;
            }
            set
            {
                if (profil != value)
                {
                    SetEstModifieTrue();
                }
                profil = value;
            }
        }

        public SousCategorie SousCategorie
        {
            get
            {
                return sousCategorie;
            }
            set
            {
                if (sousCategorie != value)
                {
                    SetEstModifieTrue();
                }
                sousCategorie = value;
            }
        }

        public string Description
        {
            get { return (!string.IsNullOrEmpty(description) ? description : String.Empty); }
            set
            {
                if (description != value)
                {
                    SetEstModifieTrue();
                }
                description = value;
            }
        }

        public DateTime Date
        {
            get { return date; }
            set
            {
                if (date != value)
                {
                    SetEstModifieTrue();
                }
                date = value;
            }
        }

        public decimal Montant
        {
            get { return Math.Round(montant * profil.Devise.Valeur, 2); }
            set
            {
                decimal nouveauMontant = value / profil.Devise.Valeur;
                if (montant != nouveauMontant)
                {
                    SetEstModifieTrue();
                }
                montant = nouveauMontant;
            }
        }

        public decimal MontantCanadien
        {
            get { return montant; }
        }

        public string Type
        {
            get
            {
                return SousCategorie.Type;
            }
        }

        public override string ToString()
        {
            return Identifiant.ToString();
        }

        static public List<Transaction> ChargerListe()
        {

            CreerFichier(NOM_FICHIER_XML, RACINE_XML);

            try
            {
                List<Transaction> ListeTransactions = new List<Transaction>();
                XElement xelement = XElement.Load(NOM_FICHIER_XML);

                IEnumerable<XElement> transactions = xelement.Elements();

                foreach (var transaction in transactions)
                {
                    Transaction nouvelleTransaction = new Transaction(transaction.Element("identifiant").Value,
                                                                        transaction.Element("identifiantProfil").Value,
                                                                        transaction.Element("sousCategorie").Value,
                                                                        transaction.Element("description").Value,
                                                                        transaction.Element("date").Value,
                                                                        transaction.Element("montant").Value);
                    ListeTransactions.Add(nouvelleTransaction);
                }

                return ListeTransactions;
            }
            catch (Exception e)
            {
                MessageBox.Show("Une erreur est survenue lors du chargement des transactions; " + e.Message, "Attention", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return null;
            }
        }

        public override void Sauvegarder()
        {
            CreerFichier(NOM_FICHIER_XML, RACINE_XML);

            try
            {
                if (this.EstModifie || this.EstNouveau)
                {
                    XDocument xDocument = XDocument.Load(NOM_FICHIER_XML);

                    if (this.EstNouveau)
                    {
                        if (this.Identifiant == 0)
                        {
                            AttribuerIdentifiant();
                        }

                        xDocument.Root.Add(new XElement("Transaction", new XElement("identifiant", this.identifiant.ToString()),
                                                                        new XElement("identifiantProfil", this.profil.Identifiant.ToString()),
                                                                        new XElement("sousCategorie", this.sousCategorie.Identifiant.ToString()),
                                                                        new XElement("description", this.description),
                                                                        new XElement("date", this.date.ToString()),
                                                                        new XElement("montant", this.MontantCanadien.ToString())));
                    }
                    else if (this.EstModifie)
                    {
                        IEnumerable<XElement> transactions = xDocument.Elements();
                        XElement elementTransaction = (from transaction in transactions.Elements()
                                                       where transaction.Element("identifiant").Value.Equals(this.Identifiant.ToString())
                                                       select transaction).First();
                        elementTransaction.Element("sousCategorie").Value = this.SousCategorie.Identifiant.ToString();
                        elementTransaction.Element("description").Value = this.Description;
                        elementTransaction.Element("date").Value = this.Date.ToString();
                        elementTransaction.Element("montant").Value = this.MontantCanadien.ToString();
                    }

                    xDocument.Save(NOM_FICHIER_XML);

                    base.Sauvegarder();
                }
            }
            catch (Exception e)
            {
                MessageBox.Show("Une erreur est survenue lors de la sauvegarde d'une transaction; " + e.Message, "Attention", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }

        public override void Supprimer()
        {
            if (!this.EstNouveau)
            {
                try
                {
                    XDocument xDocument = XDocument.Load(NOM_FICHIER_XML);
                    IEnumerable<XElement> transactions = xDocument.Elements();
                    XElement elementTransaction = (from transaction in transactions.Elements()
                                                   where transaction.Element("identifiant").Value.Equals(this.Identifiant.ToString())
                                                   select transaction).First();
                    elementTransaction.Remove();
                    xDocument.Save(NOM_FICHIER_XML);
                }
                catch (Exception e)
                {
                    MessageBox.Show("Une erreur est survenue lors de la suppression d'une transaction; " + e.Message,"Attention",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
                }
            }
            DictionnaireDonnees.ListeTransactions.Remove(this);
            this.Dispose();
        }

        public override void AttribuerIdentifiant()
        {
            if (this.identifiant == 0)
            {
                this.identifiant = DictionnaireDonnees.ListeTransactions.OrderBy(trans => trans.Identifiant).Last().Identifiant + 1;
            }
        }
    }
}
